home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / WarpQuake / Src / wad.c < prev    next >
C/C++ Source or Header  |  2000-05-22  |  4KB  |  159 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // wad.c
  21.  
  22. #include "quakedef.h"
  23.  
  24. int            wad_numlumps;
  25. lumpinfo_t    *wad_lumps;
  26. byte        *wad_base;
  27.  
  28. void SwapPic (qpic_t *pic);
  29.  
  30. /*
  31. ==================
  32. W_CleanupName
  33.  
  34. Lowercases name and pads with spaces and a terminating 0 to the length of
  35. lumpinfo_t->name.
  36. Used so lumpname lookups can proceed rapidly by comparing 4 chars at a time
  37. Space padding is so names can be printed nicely in tables.
  38. Can safely be performed in place.
  39. ==================
  40. */
  41. void W_CleanupName (char *in, char *out)
  42. {
  43.     int        i;
  44.     int        c;
  45.     
  46.     for (i=0 ; i<16 ; i++ )
  47.     {
  48.         c = in[i];
  49.         if (!c)
  50.             break;
  51.             
  52.         if (c >= 'A' && c <= 'Z')
  53.             c += ('a' - 'A');
  54.         out[i] = c;
  55.     }
  56.     
  57.     for ( ; i< 16 ; i++ )
  58.         out[i] = 0;
  59. }
  60.  
  61.  
  62.  
  63. /*
  64. ====================
  65. W_LoadWadFile
  66. ====================
  67. */
  68. void W_LoadWadFile (char *filename)
  69. {
  70.     lumpinfo_t        *lump_p;
  71.     wadinfo_t        *header;
  72.     unsigned        i;
  73.     int                infotableofs;
  74.     
  75.     wad_base = COM_LoadHunkFile (filename);
  76.     if (!wad_base)
  77.         Sys_Error ("W_LoadWadFile: couldn't load %s", filename);
  78.  
  79.     header = (wadinfo_t *)wad_base;
  80.     
  81.     if (header->identification[0] != 'W'
  82.     || header->identification[1] != 'A'
  83.     || header->identification[2] != 'D'
  84.     || header->identification[3] != '2')
  85.         Sys_Error ("Wad file %s doesn't have WAD2 id\n",filename);
  86.         
  87.     wad_numlumps = LittleLong(header->numlumps);
  88.     infotableofs = LittleLong(header->infotableofs);
  89.     wad_lumps = (lumpinfo_t *)(wad_base + infotableofs);
  90.     
  91.     for (i=0, lump_p = wad_lumps ; i<wad_numlumps ; i++,lump_p++)
  92.     {
  93.         lump_p->filepos = LittleLong(lump_p->filepos);
  94.         lump_p->size = LittleLong(lump_p->size);
  95.         W_CleanupName (lump_p->name, lump_p->name);
  96.         if (lump_p->type == TYP_QPIC)
  97.             SwapPic ( (qpic_t *)(wad_base + lump_p->filepos));
  98.     }
  99. }
  100.  
  101.  
  102. /*
  103. =============
  104. W_GetLumpinfo
  105. =============
  106. */
  107. lumpinfo_t    *W_GetLumpinfo (char *name)
  108. {
  109.     int        i;
  110.     lumpinfo_t    *lump_p;
  111.     char    clean[16];
  112.     
  113.     W_CleanupName (name, clean);
  114.     
  115.     for (lump_p=wad_lumps, i=0 ; i<wad_numlumps ; i++,lump_p++)
  116.     {
  117.         if (!strcmp(clean, lump_p->name))
  118.             return lump_p;
  119.     }
  120.     
  121.     Sys_Error ("W_GetLumpinfo: %s not found", name);
  122.     return NULL;
  123. }
  124.  
  125. void *W_GetLumpName (char *name)
  126. {
  127.     lumpinfo_t    *lump;
  128.     
  129.     lump = W_GetLumpinfo (name);
  130.     
  131.     return (void *)(wad_base + lump->filepos);
  132. }
  133.  
  134. void *W_GetLumpNum (int num)
  135. {
  136.     lumpinfo_t    *lump;
  137.     
  138.     if (num < 0 || num > wad_numlumps)
  139.         Sys_Error ("W_GetLumpNum: bad number: %i", num);
  140.         
  141.     lump = wad_lumps + num;
  142.     
  143.     return (void *)(wad_base + lump->filepos);
  144. }
  145.  
  146. /*
  147. =============================================================================
  148.  
  149. automatic byte swapping
  150.  
  151. =============================================================================
  152. */
  153.  
  154. void SwapPic (qpic_t *pic)
  155. {
  156.     pic->width = LittleLong(pic->width);
  157.     pic->height = LittleLong(pic->height);    
  158. }
  159.